/*
 * 文件名: CheckUpdateDialog.java
 * 版    权：  Copyright PingAn Technology All Rights Reserved.
 * 描    述: [该类的简要描述]
 * 创建人: EX-LIJINHUA001
 * 创建时间: 2012-2-3
 * 
 * 修改人：
 * 修改时间:
 * 修改内容：[修改内容]
 */
package app.widget.dialog;

import java.util.List;
import java.util.Map;

import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.TextView;
import app.log.APPLog;
import app.struct.AppKeyConstants;
import app.struct.DataHashMap;
import app.utils.CommonUtils;
import app.utils.Constants;
import app.utils.DataCache;
import app.utils.Tools;

import com.longevityassistant.activity.R;

/**
 * 版本更新对话框
 * 
 * @author EX-LIJINHUA001
 * @date 2012-2-3
 * @version [Android PABank C01, @2012-2-3]
 * @description
 */
public class CheckUpdateDialog extends Dialog implements android.view.View.OnClickListener {

	/**
	 * Log标签
	 */
	private static final String TAG = CheckUpdateDialog.class.getSimpleName();

	/**
	 * 提示标题
	 */
	private TextView tvTitle;
    
	/**
	 * 第一个按钮
	 */
    private Button btn1;
    
    /**
     * 第二个按钮
     */
    private Button btn2;
    
    /**
     * 第三个按钮
     */
    private Button btn3;
    
	/**
	 * 内容
	 */
	private TextView tvMessage;

	/**
	 * context
	 */
	private Context context;

	/**
	 * 监听器
	 */
	private CheckUpdateListener checkUpdateListener;

	/**
	 * 检查的状态
	 */
	private boolean mCheckState = false;

	/**
	 * 是否是最新版本
	 */
	private boolean isLastVersion = false;

	/**
	 * 是否是强制更新
	 */
	private boolean isForceUpdate = false;

	/**
	 * 是否是忽略此版本更新
	 */
	private boolean isIgnoreThisVersionUpdate = false;
	
	/**
	 * 更新提示信息
	 */
	private String updateDetails = "";

	/**
	 * 更新地址
	 */
	private String updateAddress = "";

	/**
	 * 本地版本
	 */
	private String mLocalVersion;
	
	/**
	 * 用户手动检查更新
	 */
	private boolean isUserCheck = false;

	/**
	 * 
	 * [构造简要说明]
	 * 
	 * @param context
	 */
	public CheckUpdateDialog(Context context) {
		super(context);

		this.context = context;
		init();
		initUpdateInfo();

		setVersionInfo(isForceUpdate);
	}

	/**
	 * 
	 * [构造简要说明]
	 * 
	 * @param context
	 */
	public CheckUpdateDialog(Context context,boolean isUserCheck) {
		super(context);

		this.context = context;
		this.isUserCheck = isUserCheck;
		init();
		initUpdateInfo();

		setVersionInfo(isForceUpdate);
	}
	
	/**
	 * 初始化控件
	 * [一句话功能简述]<BR>
	 * [功能详细描述]
	 */
	private void init() {
        
        this.getContext().setTheme(android.R.style.Theme_InputMethod);
        super.setContentView(R.layout.app_widget_layout_check_update_dialog);
        
        tvTitle = (TextView) findViewById(R.id.tv_title);
        
        tvMessage = (TextView)findViewById(R.id.tv_message);
        
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        
        Window window  = getWindow();
        WindowManager.LayoutParams attributesParams = window.getAttributes();
        attributesParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        attributesParams.dimAmount = 0.4f;
        
        window.setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    }

	/**
	 * 初始化数据 [一句话功能简述]<BR>
	 * [功能详细描述]
	 */
	private void initUpdateInfo() {
		DataHashMap<String, Object> config = (DataHashMap<String, Object>) DataCache
				.getCache(R.string.APP_CONFIG, 0);

		
		mLocalVersion = getLocalVersion();

		String lastVersion;
		String forcuUpdateDetails;

		if (config != null) {
			lastVersion = config.getStringBykey(Tools.getKey(
					AppKeyConstants.APPLICATION,
					AppKeyConstants.ANDROID_LATEST_VERSION));
			forcuUpdateDetails = config.getStringBykey(Tools.getKey(
					AppKeyConstants.APPLICATION,
					AppKeyConstants.ANDROID_FORCE_HINT_MSG));
			updateAddress = config.getStringBykey(Tools.getKey(
					AppKeyConstants.APPLICATION,
					AppKeyConstants.ANDROID_UPDATE_ADDRESS));

			
			
			
			int i = mLocalVersion.compareTo(lastVersion);
			if (i >= 0) {
				// 当前已经是最新版本
				isLastVersion = true;
				updateDetails = context.getResources().getString(
						R.string.version_update_is_last);
				return;
			}

			Map<String, Object> map = getUpdateVersion(config);

			if (null == map) {
				// 强制升级
				isForceUpdate = true;
				updateDetails = forcuUpdateDetails;
			} else {
				String updateState = (String) map
						.get(AppKeyConstants.FLAG);
				if ("0".equals(updateState)) {
					// 不需要提示更新
					isIgnoreThisVersionUpdate = true;
					updateDetails = (String) map
						.get(AppKeyConstants.HINT_MSG);
				} else {
					// 需要提示更新
					updateDetails = (String) map
							.get(AppKeyConstants.HINT_MSG);
					
					//本地的版本信息
					SharedPreferences mShare = CommonUtils.getSysShare(getContext(), Constants.CACHE_SYSUSERINFO_MAP);
					if(mShare != null){
						String localLastVersion = mShare.getString(AppKeyConstants.LOCAL_LATEST_VERSION_NAME, "");
						boolean alertFlag = Boolean.parseBoolean(mShare.getString(AppKeyConstants.ALERT_FLAG, "true"));
						
						if( null == localLastVersion || "".equals(localLastVersion)){
							//本地最新版本还没有的情况
							localLastVersion = lastVersion;
							CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.LOCAL_LATEST_VERSION_NAME, lastVersion);
							CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.ALERT_FLAG, "true");
							return;
						}
						
						int ii = localLastVersion.compareTo(lastVersion);
						if (ii < 0 || alertFlag) {
							// 本地缓存的最新版本号小于服务器最新版本号 或 标识为需要提示
							CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.LOCAL_LATEST_VERSION_NAME, lastVersion);
							CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.ALERT_FLAG, "true");
							isIgnoreThisVersionUpdate = false;
						}else{
							//否则忽略掉此版本
							isIgnoreThisVersionUpdate = true;
						}
						
					}
					
				}
			}

		} else {
			// AppConfig不存在时
			// 当前已经是最新版本
			updateDetails = context.getResources().getString(
					R.string.version_update_is_last);
			isLastVersion = true;
		}
	}

	/**
	 * 获取更新的信息
	 * 
	 * @param config
	 * @return
	 */
	private Map<String, Object> getUpdateVersion(
			DataHashMap<String, Object> config) {

		List<Map<String, Object>> list = config.getListByKey(Tools.getKey(
				AppKeyConstants.APPLICATION, AppKeyConstants.ANDROID_UPGRADE_LIST),
				AppKeyConstants.ELEMENT);

		if (null != list) {
			int size = list.size();
			Map<String, Object> map;
			for (int i = 0; i < size; i++) {
				map = list.get(i);
				if (null != map) {
					String version = (String) map.get(AppKeyConstants.VERSION);
					if (mLocalVersion.equals(version)) {
						return map;
					}
				}
			}
		}

		return null;
	}

	/**
	 * 获取本地版本号 [一句话功能简述]<BR>
	 * [功能详细描述]
	 * 
	 * @return
	 */
	private String getLocalVersion() {
		String versionName = "";

		try {
			PackageInfo pinfo = context.getPackageManager()
					.getPackageInfo(context.getPackageName(),
							PackageManager.GET_CONFIGURATIONS);
			versionName = pinfo.versionName;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return versionName;
	}


	/**
	 * 设置信息 [一句话功能简述]<BR>
	 * [功能详细描述]
	 * 
	 * @param text
	 */
	private void setMessage(String text) {

		tvMessage.setText(text);
	}

	/**
	 * 设置版本信息
	 * 
	 * @param isCheckLast
	 * @param apkUrl
	 * @param isForcuUpdate
	 */
	private void setVersionInfo(final boolean isForcuUpdate) {

		if (isForcuUpdate) {
			// 强制更新标识，则默认设置检查失败
			mCheckState = false;
		} else {
			// 非强制更新标识，则默认设置检查成功
			mCheckState = true;
		}

		if(updateDetails == null){
			updateDetails = "";
		}
		
		if (isLastVersion) {
			// 当前已经是最新版本

			tvTitle.setText(R.string.version_update_title);
			this.setMessage(updateDetails);
			btn2.setVisibility(View.GONE);
			btn3.setVisibility(View.GONE);
			btn1.setText(R.string.sure);
			
			LayoutParams lp = tvMessage.getLayoutParams();
			lp.height = LayoutParams.FILL_PARENT;
			lp.width = LayoutParams.FILL_PARENT;
			tvMessage.setLayoutParams(lp);
			tvMessage.setGravity(Gravity.CENTER);
			mCheckState = true;
			APPLog.i(TAG, "当前已经是最新版本");
		} else {
			// 提示更新

			String msg = context.getResources().getString(
					R.string.version_update_title_find_last);

			updateDetails = updateDetails.replace("\\n", "\n");
			tvTitle.setText(msg);
			this.setMessage(updateDetails);
			
			
			if(isForcuUpdate){
				//强制更新
				btn3.setVisibility(View.GONE);
				btn2.setText(R.string.version_update_exit);
				
			}else{
				//非强制更新
				if(isUserCheck){
					//为用户手动检查版本更新
					btn3.setVisibility(View.GONE);
					btn2.setText(R.string.cancel);
				}
			}

		}

	}

	/**
	 * 跳转下载APK [一句话功能简述]<BR>
	 * [功能详细描述]
	 * 
	 * @param apkUrl
	 */
	private void jumpDownApk(String url) {

		if (url != null && !url.equals("")) {
			if (!url.startsWith("http://") && !url.startsWith("https://")) {
				url = "http://" + url;
			}
		}

		if (!URLUtil.isNetworkUrl(url)) {

			Log.e(TAG, "APK 下载地址不合法 :" + url);
			return;
		}

		context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
	}

	/**
	 * 关掉对话框 [一句话功能简述]<BR>
	 * [功能详细描述]
	 * 
	 * @param checkState
	 */
	private void dismiss(boolean checkState) {
		mCheckState = checkState;
		dismiss();
	}

	@Override
	public void dismiss() {
		// TODO Auto-generated method stub
		super.dismiss();

		if (checkUpdateListener != null) {
			checkUpdateListener.onCheckUpdate(mCheckState);
		}
	}

	/**
	 * 检查当前是否为最新版本
	 * @return
	 */
	public boolean isLastVersion() {
		if(isUserCheck){
			//用户手动更新
			return isLastVersion;
		}else{
			//自动更新
			if(isIgnoreThisVersionUpdate){
				//被忽略掉该版本，自动更新不需要提示
				return true;
			}
			
			//否则返回是否是最新版本
			return isLastVersion;
//			if(isLastVersion && !isForceUpdate && isIgnoreThisVersionUpdate){
//				//当前是最新版本，且不被强制更新，且本地已经忽略该版本的更新,则认为该版本是最新，即不需要提示
//				return true;
//			}else{
//				return false;
//			}
		}
	}
	
	/**
	 * 设置版本更新监听器
	 * 
	 * @param checkUpdateListener
	 */
	public void setCheckUpdateListener(CheckUpdateListener checkUpdateListener) {
		this.checkUpdateListener = checkUpdateListener;
	}

	public interface CheckUpdateListener {
		/**
		 * 
		 * 检查响应回调，检查不通过时，不允许启动应用
		 * 
		 * @param isCheck
		 *            true:检查通过；false:检查不通过
		 */
		public void onCheckUpdate(boolean isCheck);
	}

	@Override
	public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btn1:
            	if(isLastVersion){
            		//属于最新版本
            		APPLog.i(TAG, "属于最新版本");
            		dismiss(true);
            	} else if(isForceUpdate){
            		//强制更新 确认更新跳转
            		APPLog.i(TAG, "强制更新 确认更新跳转");
            		dismiss(false);
            		jumpDownApk(updateAddress);
            	} else {
            		//非强制更新 确认更新跳转
            		APPLog.i(TAG, "非强制更新 确认更新跳转");
					dismiss(true);
					jumpDownApk(updateAddress);
            	}
                break;
            case R.id.btn2:
            	if(isForceUpdate){
            		//强制更新 用户选择退出应用
            		APPLog.i(TAG, "强制更新 用户选择退出应用");
            		dismiss(false);
            	} else {
            		//非强制更新 用户选择下次提示
            		
            		if(isUserCheck){
            			//用户点击手动更新后选择取消
            			APPLog.i(TAG, "非强制更新 用户选择下次提示 1");
            		}else{
            			//非用户主动检查更新时选择下次更新
            			APPLog.i(TAG, "非强制更新 用户选择下次提示2");
            			CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.ALERT_FLAG, "true");
            		}
					dismiss(true);
            	}
                break;
            case R.id.btn3:
                //在非强制更新情况下，用户选择不再提示更新
            	APPLog.i(TAG, "在非强制更新情况下，用户选择不再提示更新");
            	CommonUtils.saveSysMap(getContext(), Constants.CACHE_SYSUSERINFO_MAP, AppKeyConstants.ALERT_FLAG, "false");
            	dismiss(true);
            break;
            default:
                break;
        }
    }
}
